/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	HFieldRadioGroup.java
 * 模块说明：	Radio输入框 | 服务端界面控件
 * 修改历史：
 * 2006-5-26 - lxm - 创建。
 */
package com.hd123.rumba.jsp;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.ecs.html.Input;
import org.apache.ecs.html.Label;

import com.hd123.rumba.request.Dictionary;
import com.hd123.rumba.util.AccessMode;

/**
 * Radio输入框 | 服务端界面控件
 * <p>
 * 显示多个&lt;input type=radio&gt;
 * <p>
 * 
 * 页面模型：<br>
 * <table border=0 cellspacing=3 cellpadding=0>
 * <tr bgcolor=skyblue>
 * <td>界面元素</td>
 * <td>对象属性</td>
 * </tr>
 * <tr>
 * <td><code>&lt;td&gt;</code></td>
 * <td><i>tdLabel</i></td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;...</code></td>
 * <td>参见{@link LabelHField LabelHField}</td>
 * </tr>
 * <tr>
 * <td><code>&lt;td&gt;</code></td>
 * <td><i>tdContent</i></td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;{&lt;input type=radio&gt;}</code></td>
 * <td>radios</td>
 * </tr>
 * <tr>
 * <td><code>&nbsp;&nbsp;{&lt;label&gt;}</code></td>
 * <td>radioLabels</td>
 * </tr>
 * </table>
 * 
 * @author lxm
 * 
 */
public class HFieldRadioGroup extends OptionalHField {

  /** 属性alignment的取值。表示选项垂直排列。 */
  public static final Integer ALIGNMENT_VERTICAL = new Integer(0);
  /** 属性alignment的取值。表示选项水平排列。 */
  public static final Integer ALIGNMENT_HORIZONTAL = new Integer(1);

  public HFieldRadioGroup(Dictionary dd, String name, String caption, Object value, Object[] params) {
    super(dd, name, caption, value, params);
  }

  public HFieldRadioGroup(Dictionary dd, String name, String caption, Object value) {
    super(dd, name, caption, value);
  }

  private Integer alignment;

  public Integer getAlignment() {
    return alignment;
  }

  public void setAlignment(Integer alignment) {
    this.alignment = alignment;
  }

  protected boolean readParam(String paramName, Object paramValue) {
    if (super.readParam(paramName, paramValue))
      return true;
    if ("alignment".equals(paramName)) {
      this.alignment = (Integer) paramValue;
      return true;
    }
    return false;
  }

  private List<Input> radios = new ArrayList();
  private Input radio = null;
  private List<Label> radioLabels = new ArrayList();
  private Label radioLabel = null;

  /**
   * 只读属性：存放输入部分的界面元素&lt;input type=radio&gt;<br>
   * 注意：这并不指向真正的界面元素，因为真正的界面元素是一个列表。但可以通过对所有的界面元素设置属性。<br>
   * 对应的参数名"radio"。通过参数的方法设置属性，始终是对所有radio元素有效。
   */
  public Input getRadio() {
    if (radio == null) {
      radio = new Input();
      radio.setType("radio");
      radio.setID(this.getName() + "_");
      radio.setName(this.getName());
    }
    return radio;
  }

  /**
   * 只读属性：存放输入部分的界面元素&lt;label&gt;<br>
   * 注意：这并不指向真正的界面元素，因为真正的界面元素是一个列表。但可以通过对所有的界面元素设置属性。<br>
   * 对应的参数名"radioLabel"。通过参数的方法设置属性，始终是对所有radioLabel元素有效。
   */
  public Label getRadioLabel() {
    if (radioLabel == null) {
      radioLabel = new Label();
    }
    return radioLabel;
  }

  protected void buildHTML(int accessMode, int promptMode) {
    super.buildHTML(accessMode, promptMode);
    radios.clear();
    radioLabels.clear();
    KeyValueList options = this.getOptions();
    for (int i = 0; i < options.size(); i++) {
      Object value = options.getKey(i);
      String valueCaption = (String) options.get(value);

      Input radio = new Input();
      radio.setType("radio");
      radio.setID(this.getName() + "_" + i);
      radio.setName(this.getName());
      if (this.radio != null)
        this.assignElementAttrs(this.radio, radio, new String[] {
            "type", "id", "name" });
      if (value instanceof String)
        radio.setValue((String) value);
      else if (value instanceof Integer)
        radio.setValue(((Integer) value).intValue());
      else if (value instanceof Double)
        radio.setValue(((Double) value).doubleValue());
      else if (value instanceof BigDecimal)
        radio.setValue(((BigDecimal) value).doubleValue());
      else
        radio.setValue(value.toString());
      if (accessMode != AccessMode.READWRITE)
        radio.setDisabled(true);
      if (value.equals(this.getValue()) && accessMode != AccessMode.INVISIBLE)
        radio.setChecked(true);
      this.assignElementAttrs(radio, "radio");
      this.getTdContent().addElement(radio);
      radios.add(radio);

      Label label = new Label();
      if (this.radioLabel != null)
        this.assignElementAttrs(this.radioLabel, label, null);
      label.setClass("small_radio");
      label.setFor(this.getName() + "_" + i);
      label.addElement(valueCaption);
      this.assignElementAttrs(label, "radioLabel");
      this.getTdContent().addElement(label);
      if (ALIGNMENT_HORIZONTAL.equals(this.alignment))
        this.getTdContent().addElement("&nbsp;");
      else
        this.getTdContent().addElement("<br>");
      radioLabels.add(label);
    }
  }
}
